//
//! Copyright 2020 Alibaba Group Holding Limited.
//!
//! Licensed under the Apache License, Version 2.0 (the "License");
//! you may not use this file except in compliance with the License.
//! You may obtain a copy of the License at
//!
//! http://www.apache.org/licenses/LICENSE-2.0
//!
//! Unless required by applicable law or agreed to in writing, software
//! distributed under the License is distributed on an "AS IS" BASIS,
//! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//! See the License for the specific language governing permissions and
//! limitations under the License.

// TODO(longbin) We've only implement where $obj is a type that is supported by `$crate::Object::from` function.

#[macro_export]
macro_rules! object {
    ($obj:expr) => {
        $crate::Object::from($obj)
    };
}

#[macro_export]
macro_rules! try_downcast {
    ($var: expr, $ty: ty) => {
        if let Some(v) = $var.try_downcast_ref::<$ty>() {
            Ok(*v)
        } else {
            Err($crate::CastError::new::<$ty>($crate::object::RawType::Unknown))
        }
    };

    ($var: expr, $ty: ty, $op: ident) => {
        if let Some(v) = $var.try_downcast_ref::<$ty>() {
            Ok(v.$op())
        } else {
            Err($crate::CastError::new::<$ty>($crate::object::RawType::Unknown))
        }
    };
}

#[macro_export]
macro_rules! try_downcast_ref {
    ($var: expr, $ty: ty) => {
        if let Some(v) = $var.try_downcast_ref::<$ty>() {
            Ok(v)
        } else {
            Err($crate::CastError::new::<$ty>($crate::object::RawType::Unknown))
        }
    };
}
